package com.ssd.utils;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import feign.QueryMapEncoder;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * 请求参数序列化
 * 实现了将对象序列化为Map结构，以便在HTTP请求中使用
 * 主要解决了Jackson序列化库对LocalDateTime支持不足的问题
 */
public class MyQueryMapEncoder implements QueryMapEncoder {
    // 创建一个ObjectMapper实例，用于JSON序列化和反序列化
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 序列化对象为Map
     *
     * @param o 待序列化的对象
     * @return 序列化后的Map对象
     * @throws RuntimeException 如果序列化过程中发生错误
     */
    @Override
    public Map<String, Object> encode(Object o) {
        try {
            // 将对象序列化为JSON字符串
            String s = objectMapper.writeValueAsString(o);
            // 将JSON字符串反序列化为Map对象
            return objectMapper.readValue(s, Map.class);
        } catch (JsonProcessingException e) {
            // 如果序列化过程中发生错误，抛出运行时异常
            throw new RuntimeException(e);
        }
    }

    /**
     * 静态代码块，用于初始化ObjectMapper
     * 主要添加了对LocalDateTime的序列化支持
     */
    static {
        // 创建JavaTimeModule模块，用于支持Java 8时间API的序列化和反序列化
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        // 创建DateTimeFormatter实例，用于LocalDateTime的序列化
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        // 为LocalDateTime类型添加自定义的序列化器
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
        // 注册JavaTimeModule模块到ObjectMapper
        objectMapper.registerModule(javaTimeModule);
    }
}

